﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sped.Sped
{
    /// <summary>
    /// REGISTRO 0500: PLANO DE CONTAS CONTÁBEIS
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("SpedPisCofins.Reg0500")]
    [ComVisible(true)]
    public class Reg0500 : IBloco
    {
        /// <summary>
        /// Data da inclusão/alteração
        /// </summary>
        public DateTime DT_ALT { get; set; }
        /// <summary>
        /// Código da natureza da conta/grupo de contas:
        ///     01 - Contas de ativo
        ///     02 - Contas de passivo;
        ///     03 - Patrimônio líquido;
        ///     04 - Contas de resultado;
        ///     05 - Contas de compensação;
        ///     09 - Outras.
        /// </summary>
        public string COD_NAT_CC { get; set; }
        /// <summary>
        /// Indicador do tipo de conta:
        ///     S - Sintética (grupo de contas);
        ///     A - Analítica (conta).
        /// </summary>
        public string IND_CTA { get; set; }
        /// <summary>
        /// Nível da conta analítica/grupo de contas
        /// </summary>
        public string NIVEL { get; set; }
        /// <summary>
        /// Código da conta analítica/grupo de contas.
        /// </summary>
        public string COD_CTA { get; set; }
        /// <summary>
        /// Nome da conta analítica/grupo de contas
        /// </summary>
        public string NOME_CTA { get; set; }
        /// <summary>
        /// Código da conta correlacionada no Plano de Contas
        /// Referenciado, publicado pela RFB
        /// </summary>
        public string COD_CTA_REF { get; set; }
        /// <summary>
        /// CNPJ do estabelecimento, no caso da conta informada no 
        /// campo COD_CTA ser específica de um estabelecimento.
        /// </summary>
        public string CNPJ_EST { get; set; }

        public override bool ValidaRegistro(ref string Erro)
        {
            var ValidacaoOK = true;
            Erro = "";

            if (string.IsNullOrEmpty(this.COD_NAT_CC) || !this.COD_NAT_CC.StringIN("01-02-03-04-05-09"))
            {
                Erro += "\r\n* Registro 0500 - Código da natureza da conta/grupo de contas inválida.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.IND_CTA) || !this.IND_CTA.StringIN("S-A"))
            {
                Erro += "\r\n* Registro 0500 - Indicador do tipo de conta inválida.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.NIVEL))
            {
                this.NIVEL = string.Empty;
                Erro += "\r\n* Registro 0500 - Nível da conta analítica/grupo de contas não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_CTA))
            {
                this.COD_CTA = string.Empty;
                Erro += "\r\n* Registro 0500 - Código da conta analítica/grupo de contas não informada.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.NOME_CTA))
            {
                this.NOME_CTA = string.Empty;
                Erro += "\r\n* Registro 0500 -Nome da conta analítica/grupo de contas não informada.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_CTA_REF))
                this.COD_CTA_REF = string.Empty;

             if (string.IsNullOrEmpty(this.COD_NAT_CC))
                 this.COD_NAT_CC = string.Empty;

             if (string.IsNullOrEmpty(this.IND_CTA))
                 this.IND_CTA = string.Empty;

             if (string.IsNullOrEmpty(this.CNPJ_EST))
                 this.CNPJ_EST = string.Empty;

            return ValidacaoOK;
        }

        public override string Layout()
        {
            var Linha = string.Empty;

            Linha += "0500" + this.Delimitador;
            Linha += this.DT_ALT.FormatoDataSped() + this.Delimitador;
            Linha += this.COD_NAT_CC.Trim() + this.Delimitador;
            Linha += this.IND_CTA.Trim() + this.Delimitador;
            Linha += this.NIVEL.Trim() + this.Delimitador;
            Linha += this.COD_CTA.Trim() + this.Delimitador;
            Linha += this.NOME_CTA.Trim().TirarAcento() + this.Delimitador;
            Linha += this.COD_CTA_REF.Trim() + this.Delimitador;
            Linha += this.CNPJ_EST.Trim().removeFormatacao() + this.Delimitador;

            return Linha.Trim();
        }
    }
}
